﻿using Cherry.Agile.Enterprise.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace Cherry.Agile.Enterprise.Services.Interface
{
    /// <summary>
    /// 组织接口
    /// </summary>
    [ServiceContract(Namespace = Unity.Namespace)]
    public partial interface IOrganizationService : IOpenOrganizationService
    {
        /// <summary>
        /// 获取所有组织
        /// </summary>
        /// <returns>组织集合</returns>
        [OperationContract]
        List<OrganizationInfo> SyncOrganizationInfo();

        /// <summary>
        /// 新增组织
        /// </summary>
        /// <param name="orgInfo">组织信息</param>
        /// <returns>组织信息</returns>
        [OperationContract]
        void AddOrg(OrganizationInfo orgInfo);

        /// <summary>
        /// 判断是否能删除该组织的状态,1表示能删除，2表示有子组织不能删除，3表示有医护人员不能删除，4表示有会员不能删除，5表示有采集器不能删除，6表示有移动终端不能删除
        /// </summary>
        /// <param name="orgID">组织ID</param>
        /// <returns>返回1表示能删除，2表示有子组织不能删除，3表示有医护人员不能删除，4表示有会员不能删除，5表示有采集器不能删除，6表示有移动终端不能删除</returns>
        [OperationContract]
        string CheckIsEnableDeleteOrgStatus(int orgID);

        /// <summary>
        /// 同一层组织下组织名称是否已存在
        /// </summary>
        /// <param name="orgID">父组织ID</param>
        /// <param name="orgName">待检查的组织名称</param>
        /// <returns></returns>
        [OperationContract]
        bool CheckOrgNameIsExists(int orgID, string orgName);

        /// <summary>
        /// 同一层组织下组织全名是否已存在
        /// </summary>
        /// <param name="orgID">父组织ID</param>
        /// <param name="orgName">待检查的组织全名</param>
        /// <returns></returns>
        [OperationContract]
        bool CheckOrgFullNameIsExists(int orgID, string orgFullName);

        /// <summary>
        /// 该组织下面是否有单位
        /// </summary>
        /// <param name="orgPath">组织路径</param>
        /// <returns></returns>
        [OperationContract]
        bool CheckIsHasSubUnit(string orgPath);

        /// <summary>
        /// 父组织ID的组织类型是否为部门
        /// </summary>
        /// <param name="orgID">父组织ID</param>
        /// <returns></returns>
        [OperationContract]
        bool CheckParentIsDept(int orgID);

        /// <summary>
        /// 修改组织
        /// </summary>
        /// <param name="orgInfo">组织信息</param>
        [OperationContract]
        void UpdateOrg(OrganizationInfo orgInfo);

        /// <summary>
        /// 删除组织
        /// </summary>
        /// <param name="orgID">组织ID</param>
        [OperationContract]
        void DeleteOrg(int orgID);

        /// <summary>
        /// 根据组织/部门ID 获取名称
        /// </summary>
        /// <param name="orgID">组织ID</param>
        /// <returns>组织实体</returns>
        [OperationContract]
        string GetOrgNameByID(int orgID);



        /// <summary>
        /// 获取单位下面的部门(不包括子单位信息)
        /// </summary>
        /// <param name="OrgID">单位ID</param>
        /// <returns>部门列表</returns>
        [OperationContract]
        List<OrganizationInfo> GetDeptsByOrgID(int OrgID);

        /// <summary>
        /// 根据组织ID列表，获取组织列表
        /// </summary>
        /// <param name="orgIdArray">组织ID数组</param>
        /// <returns>组织列表</returns>
        [OperationContract]
        List<OrganizationInfo> GetOrganizationInfoByIdArray(int[] orgIdArray);
        ///// <summary>
        ///// 根据医生ID获取医生所在组织
        ///// </summary>
        ///// <param name="doctorId"></param>
        ///// <returns></returns>
        //[OperationContract]
        //OrganizationInfo GetOrgNameByDoctor(int doctorId);

        /// <summary>
        /// 检查组织全名是否存在
        /// </summary>
        /// <param name="orgNumber">组织全名</param>
        /// <returns>是否存在</returns>
        [OperationContract]
        bool IsExistOrgFullName(string orgFullName);

        /// <summary>
        /// 根据组织编号获取组织信息
        /// </summary>
        /// <param name="orgCode">组织编号</param>
        /// <returns>组织信息</returns>
        [OperationContract]
        OrganizationInfo GetOrganizationByOrgCode(string orgCode);
    }
}
